class CentroController < ApplicationController
  require 'csv'
  
  auto_complete_for :centro, :nombre_comercial
  
  def index
    
    if perfil_director?
      logger.debug "Vista como Director"
      ordered
      render :action => 'ordered'
    elsif gerente_op?
      logger.debug "Vista como Gerente OP"
      nacional
      render :action => 'list'
    elsif perfil_asistente?
      asistente
      render :action => 'list'
    elsif perfil_captura?
      logger.debug "Vista de capturista"
      nacional
      render :action => 'list'
    elsif perfil_admin?
      logger.debug "Vista de Administrador"
      nacional
      render :action => 'list'
    elsif mando_medio?
      logger.debug "Vista de Jefe de Gpo/Gerente"
      ordered
      render :action => 'ordered'
    elsif perfil_ejecutivo?
      logger.debug "Vista de Ejecutivo"
      personal
      render :action => 'list'
    else
      logger.debug "Cualquier caso distinto a los anteriores"
      personal
      render :action => 'list'
    end

  end

  # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
  verify :method => :post, :only => [ :destroy, :create, :update ],
    :redirect_to => { :action => :list }

  def list
    ejecutivo = Ejecutivo.find(session[:user])
    these_children = find_children_ids(ejecutivo)
    @es_ejecutivo = false

    conditions = {}
    conditions[:status_id] = 1
    conditions[:ejecutivo_id] = these_children
      
    @centros = Centro.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'nombre_comercial', :conditions => conditions
    @centros_count = Centro.count( :conditions => conditions )
    @corporativos_count = Corporativo.count(:conditions => conditions)

  end

  def show
    @centro = Centro.find(params[:id])
    @presupuestos = Presupuesto.find(:all, :conditions => {:centro_id => params[:id]}, :order => 'marca_id, rubro_id')
    @total_cargos = 0.0
    @total_abonos = 0.0
    @presupuestos.each do |p|
      @total_cargos += p.cargos.sum('importe').to_f
      @total_abonos += p.abonos.sum('importe').to_f
    end
    @total_disponible = @total_abonos - @total_cargos
    @bonificaciones_generadas = @centro.bonificaciones(BonificacionDetalle::ABONO)
    @bonificaciones_gastadas = @centro.bonificaciones(BonificacionDetalle::CARGO)
  end

  def new
    @centro = Centro.new
    @delegaciones = []

  end

  def create
    @centro = Centro.new(params[:centro])
    @centro.ejecutivo_id = session[:user]
    @centro.status_id = 1
    
    # los ejecutivos crean centros con status con valor 0
    # ejecutivo = Ejecutivo.find(session[:user])
    # puesto_id_ejecutivo = Catalogo.valor_id('Puestos Ejecutivos', 'Ejecutivo CDC')
    # if ejecutivo.puesto_id == puesto_id_ejecutivo
    #  @centro.status_id = 0 
    #else
    #  @centro.status_id = 1
    #end

    if @centro.save
      flash[:notice] = 'El Centro se creo correctamente.'
      redirect_to :action => 'list'
    else
      @delegaciones = []
      render :action => 'new'
    end
  end

  def edit
    @centro = Centro.find(params[:id])
    @delegaciones = Catalogo.all_values('Estados', @centro.estado_id)
    @status = Catalogo.find_by_nombre('Status Items').entradas_catalogo
    @ejecutivos = Ejecutivo.personal_cuervo

  end

  def update
    @centro = Centro.find(params[:id])
    if @centro.update_attributes(params[:centro])
      flash[:notice] = 'El Centro se actualizo correctamente.'
      redirect_to :action => 'show', :id => @centro
    else
      @delegaciones = Catalogo.all_values('Estados', @centro.estado_id)
      @status = Catalogo.find_by_nombre('Status Items').entradas_catalogo
      @ejecutivos = Ejecutivo.personal_cuervo
      
      render :action => 'edit', :id =>  @centro
    end
  end

  def destroy
    Centro.find(params[:id]).destroy
    redirect_to :action => 'list'
  end
  
  def estado_changed
    unless params[:id].blank?
      logger.debug 'Estado changed ' + params[:id]

      @coleccion = Catalogo.all_values('Estados', params[:id])
    else
      @coleccion = []
    end

    render :partial => "delegaciones", :locals => { :coleccion => @coleccion }

  end

  def search
    unless params[:search].blank?
      conditions = ["concatenado LIKE ?","%#{params[:search]}%"] unless params[:search].nil?
      @centros = BusquedaCentro.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE,
        :order => 'nombre_comercial',
        :conditions => conditions
      #      :conditions => Centro.conditions_by_like(params[:search])
      @centros_count = BusquedaCentro.count(:conditions => conditions)
      @corporativos_count = Corporativo.count
      logger.info @centros.size
    else
      list
    end
    render :partial=>'search', :layout => true
  end

  def conditions_by_like(value, *columns)
    columns = self.user_columns if columns.size==0
    columns = columns[0] if columns[0].kind_of?(Array)
    conditions = columns.map {|c|
      c = c.name if c.kind_of? ActiveRecord::ConnectionAdapters::Column
      "�#{c}� LIKE " + ActiveRecord::Base.connection.quote("%#{value}%" )
    }.join(" OR " )
  end

  def txt_export
    conditions = {}
    ejecutivo = Ejecutivo.find(session[:user])
    these_children = find_children_ids(ejecutivo)
    
    if perfil_nacional?
      @centros = Centro.find(:all, :conditions => {:status_id => 1})
    else
      conditions[:ejecutivo_id] = these_children
      conditions[:status_id] = 1
      @centros = Centro.find(:all, :conditions => conditions)
      
    end
    
    report = StringIO.new
    CSV::Writer.generate(report, ',') do |csv|
      csv << ["Ejecutivo", "Nombre Comercial", "Razon Social", "RFC", "Fecha de Aniversario",
        "Calle", "Numero Exterior", "Nmero Interior", "Colonia", "Ciudad",
        "Codigo Postal", "Estado", "Delegacion/Municipio", "Telefono Lada", "Telefono Numero", "Telefono Extension",
        "Fax Lada", "Fax Numero", "Fax Extension", "Tipo Cuenta", "Giro Comercial",
        "Rango de Precio", "Nombre Contacto", "Puesto Contacto",
        "Corporativo", 
        "Region"
      ]
      @centros.each do |centro|
        csv << [Ejecutivo.find(centro.ejecutivo_id).nombre_completo, centro.nombre_comercial, centro.razon_social, centro.rfc, centro.fecha_aniversario,
          centro.calle, centro.num_exterior, centro.num_interior, centro.colonia, centro.ciudad,
          centro.codigo_postal, Catalogo.valor('Estados',centro.estado_id), Catalogo.valor('Delegaciones Municipios',centro.delegacion_municipio_id), centro.telefono_lada, centro.telefono_numero, centro.telefono_extension,
          centro.fax_lada, centro.fax_numero, centro.fax_extension, Catalogo.valor('Tipos Cuenta',centro.tipo_cuenta_id), Catalogo.valor('Giros', centro.giro_id),
          Catalogo.valor('Rangos Precio',centro.rango_precio_id), centro.nombre_contacto, Catalogo.valor('Puestos Empleados', centro.puesto_contacto_id),
          centro.corporativo_id,
          Catalogo.valor('Regiones', centro.region_id)
        ]
      end
    end
    
    report.rewind
    send_data(report.read,
      :type => 'text/csv; charset=iso-8859-1; header=present',
      :filename => 'centros.csv')
  end
  
  def ordered
    @ejecutivo = Ejecutivo.find(session[:user])
    conditions = [
      "status_id = :status_id AND ejecutivo_id IN(:these_children)",
      {:status_id => 1, :these_children => @ejecutivo.active_children}
    ]
    @ejecutivo_centros = @ejecutivo.centros.find(:all, :limit => 5)
    #@centros_count = Centro.find(:all, :conditions => conditions).size
    @centros_count = @ejecutivo.universo_centros
    #@corporativos_count = Corporativo.find(:all, :conditions => conditions).size
    @corporativos_count = @ejecutivo.universo_corporativos
    
  end
  
  def list_by_id
    conditions = {}
    conditions[:status_id] = 1
    conditions[:ejecutivo_id] = params[:id]
    @ejecutivo = Ejecutivo.find(params[:id])
    
    if @ejecutivo.puesto_id == 4      
      @centros = Centro.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'nombre_comercial', :conditions => conditions
      @centros_count = @ejecutivo.universo_centros
      @corporativos_count = @ejecutivo.universo_corporativos
      
      render :action => 'list'
    else
      @ejecutivo_centros = @ejecutivo.centros.find(:all, :limit => 5)
      @corporativos_count = @ejecutivo.universo_corporativos
      @centros_count = @ejecutivo.universo_centros
        
      render :action => "ordered"
    end
  end
  
  def deshabilitar
    @centro = Centro.find(params[:id])
    
    @centro.status_id = 0
    
    if @centro.save
      flash[:notice] = "Centro deshabilitado..."
      
      redirect_to :action => "index"
    end
  end
  
  def estado_cuenta
    @centro = Centro.find(params[:id])
    conditions = {}
    conditions[:centro_id] = params[:id]
    @presupuestos = Presupuesto.find(:all, :conditions => conditions)
    
    conditions = {}
    conditions[:presupuesto_id] = @presupuestos
    @detalles = PresupuestoDetalle.find(:all, :conditions => conditions, :order => 'created_at ASC')
    
    conditions = {}
    conditions[:presupuesto_id] = @presupuestos
    conditions[:operacion] = PresupuestoDetalle::CARGO
    @total_cargos = PresupuestoDetalle.sum('importe', :conditions => conditions).to_f
    
    conditions = {}
    conditions[:presupuesto_id] = @presupuestos
    conditions[:operacion] = PresupuestoDetalle::ABONO
    @total_abonos = PresupuestoDetalle.sum('importe', :conditions => conditions).to_f
    
    @saldo = (@total_abonos - @total_cargos).to_f
    
    # bonificaciones
    conditions = {}
    conditions[:centro_id] = params[:id]
    @bonificaciones = BonificacionDetalle.find(:all, :conditions => conditions)
    
    conditions = {}
    conditions[:centro_id] = params[:id]
    conditions[:operacion] = BonificacionDetalle::CARGO
    @bonificaciones_cargos = BonificacionDetalle.sum('importe', :conditions => conditions)

    conditions = {}
    conditions[:centro_id] = params[:id]
    conditions[:operacion] = BonificacionDetalle::ABONO
    @bonificaciones_abonos = BonificacionDetalle.sum('importe', :conditions => conditions)
    
  end
  
  def personal
    @ejecutivo = Ejecutivo.find(session[:user])
    these_children = find_children_ids(@ejecutivo)
    
    conditions = {}
    conditions[:status_id] = 1
    conditions[:ejecutivo_id] = these_children
      
    @centros = Centro.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'nombre_comercial', :conditions => conditions
    @centros_count = Centro.count( :conditions => conditions )
    @corporativos_count = Corporativo.count(:conditions => conditions)
    
  end
  
  def nacional
    conditions = {}
    conditions[:status_id] = 1
    @centros = Centro.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'nombre_comercial', :conditions => conditions
    @centros_count = Centro.count(:conditions => conditions)
    @corporativos_count = Corporativo.count(:conditions => conditions)
  end
  
  def asistente
    usuario_actual = Ejecutivo.find(session[:user])
    jefe_inmediato = Ejecutivo.find(usuario_actual.reporta_a_id)
    these_children = find_children_ids(jefe_inmediato)
    
    conditions = {}
    conditions[:ejecutivo_id] = these_children
    conditions[:status_id] = 1
    
    @centros = Centro.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'nombre_comercial', :conditions => conditions
    @centros_count = Centro.count(:conditions => conditions)
    @corporativos_count = Corporativo.count(:conditions => conditions)
    
  end
end
